import axios from "axios";
import type { AxiosRequestConfig, AxiosInstance } from "axios";

import { getToken } from "@/utils/auth";
import { SERVER_ADDRESS } from "@/config";


// // 正在进行中的请求列表
// let reqList:any = []

// /**
//  * 阻止重复请求
//  * @param {array} reqList - 请求缓存列表
//  * @param {string} url - 当前请求地址
//  * @param {function} cancel - 请求中断函数
//  * @param {string} errorMessage - 请求中断时需要显示的错误信息
//  */
// const stopRepeatRequest = function (
//   reqList: any,
//   url: any,
//   cancel: any,
//   errorMessage: any
// ) {
//   const errorMsg = errorMessage || "";
//   for (let i = 0; i < reqList.length; i++) {
//     if (reqList[i] === url) {
//       cancel(errorMsg);
//       return;
//     }
//   }
//   reqList.push(url);
// };

// /**
//  * 允许某个请求可以继续进行
//  * @param {array} reqList 全部请求列表
//  * @param {string} url 请求地址
//  */
// const allowRequest = function (reqList: any, url: any) {
//   for (let i = 0; i < reqList.length; i++) {
//     if (reqList[i] === url) {
//       reqList.splice(i, 1);
//       break;
//     }
//   }
// };



const instance: AxiosInstance = axios.create({
  baseURL: SERVER_ADDRESS,
  timeout: 5000,
  // http://120.25.79.220:8007  http://localhost:8007
});


// Add a request interceptor
// 全局请求拦截，发送请求之前执行
instance.interceptors.request.use(
  function (config: AxiosRequestConfig) {
    // Do something before request is sent
    // config.url += "&token=" + getToken();
    if (getToken()) config.headers!.Authorization = "Bearer " + getToken();

  	// // 设置cancelToken对象
    // let cancel
    // config.cancelToken = new axios.CancelToken(function(c) {
    // 	cancel = c
    // })
    // // 阻止重复请求。当上个请求未完成时，相同的请求不会进行
    // stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)

    return config;
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error);
  }
);

// Add a response interceptor
// 全局请求拦截，请求返回之后执行
instance.interceptors.response.use(
  function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    // if (response.data?.code === "401") {
    //   return Promise.reject(response.data.msg);
    // }

    // // 增加延迟，相同请求不得在短时间内重复发送
    // setTimeout(() => {
    //   allowRequest(reqList, response.config.url);
    // }, 0);

    return response.data;
  },
  function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error

    // if (axios.isCancel(error)) {
    //   console.log(error.message);
    // } else {
    //   // 增加延迟，相同请求不得在短时间内重复发送
    //   setTimeout(() => {
    //     allowRequest(reqList, error.config.url);
    //   }, 1000);
    // }

    return Promise.reject(error);
  }
);


/**
 * get请求
 * @param {*} url 请求地址
 * @param {*} params url参数
 * @returns
 */
export function get(url: string, params?: object) {
  return instance.get(url, { params }); //AxiosConfig
}

/**
 * post请求
 * @param {*} url 请求地址
 * @param {*} data  数据
 * @returns
 */
export function post(url: string, data: object | string) {
  return instance.post(url, data);
}

/**
 * put请求
 * @param {*} url 请求地址
 * @param {*} data  数据
 * @returns
 */
export function put(url: string, data?: object) {
  return instance.put(url, data);
}

/**
 * patch请求
 * @param {*} url 请求地址
 * @param {*} data  数据
 * @returns
 */
export function patch(url: string, data: object) {
  return instance.patch(url, data);
}

/**
 * delete请求
 * @param {*} url 请求地址
 * @returns
 */
export function del(url: string) {
  return instance.delete(url);
}
